package cn.piesat.translate.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @author tw
 * @Description
 * @Date 2022/8/3 14:22
 **/
public class EasyExcelUtil {

    /**
     * 动态头传入
     *
     * @param header
     * @param bigTitle
     * @return
     */
    public static List<List<String>> head(String[] header, String bigTitle, boolean flag) {
        List<String> head0 = null;
        List<List<String>> list = new LinkedList<>();
        for (String h : header) {
            head0 = new LinkedList<>();
            if (flag) {
                head0.add(bigTitle);
            }
            head0.add(h);
            list.add(head0);
        }
        return list;
    }

    /**
     * 设置标题格式
     *
     * @return
     */
    public static WriteCellStyle getHeadStyle() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("黑体");//设置字体名字
        headWriteFont.setFontHeightInPoints((short) 15);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
        // 样式
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;
        headWriteCellStyle.setWrapped(true);  //设置自动换行;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
        //        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
        return headWriteCellStyle;
    }

    /**
     * 设置内容格式
     *
     * @return
     */
    public static WriteCellStyle getCellStyle() {
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //垂直居中,水平居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        //设置 自动换行
//        contentWriteCellStyle.setWrapped(true);
        // 字体策略
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 12);
        contentWriteFont.setFontName("Times New Roman");
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        return contentWriteCellStyle;
    }

    /**
     * 写入到excel
     *
     * @param header     表头数据
     * @param nameSumMap 数据内容
     * @param path       写出路径
     */
    public static void write(String[] header, Map<String, Integer> nameSumMap, String path) {
        //标题样式
        WriteCellStyle headWriteCellStyle = EasyExcelUtil.getHeadStyle();
        //内容样式
        WriteCellStyle cellStyle = EasyExcelUtil.getCellStyle();
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, cellStyle);
        EasyExcel.write(path)
                // 第一行大标题样式设置
                // .registerWriteHandler(new SheetWriteHandlerUtil(fileName))
                //设置默认样式及写入头信息开始的行数
                // .useDefaultStyle(false).relativeHeadRowIndex(1)
                .useDefaultStyle(false)
                // 表头、内容样式设置
                .registerWriteHandler(horizontalCellStyleStrategy)
                // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(15))
                .sheet()
                // 这里放入动态头
                .head(EasyExcelUtil.head(header, null, false))
                // 当然这里数据也可以用 List<List<String>> 去传入
                .doWrite(detail(nameSumMap));
    }


    /**
     * 导出到excel
     *
     * @param header     表头数据
     * @param nameSumMap 数据内容
     * @param response   写出路径
     */
    public static void  write(String[] header, Map<String, Integer> nameSumMap, HttpServletResponse response) throws IOException {
        //标题样式
        WriteCellStyle headWriteCellStyle = EasyExcelUtil.getHeadStyle();
        //内容样式
        WriteCellStyle cellStyle = EasyExcelUtil.getCellStyle();
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, cellStyle);
        EasyExcel.write(response.getOutputStream())
                // 第一行大标题样式设置
                // .registerWriteHandler(new SheetWriteHandlerUtil(fileName))
                //设置默认样式及写入头信息开始的行数
                // .useDefaultStyle(false).relativeHeadRowIndex(1)
                .useDefaultStyle(false)
                // 表头、内容样式设置
                .registerWriteHandler(horizontalCellStyleStrategy)
                // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(15))
                .sheet()
                // 这里放入动态头
                .head(EasyExcelUtil.head(header, null, false))
                // 当然这里数据也可以用 List<List<String>> 去传入
                .doWrite(detail(nameSumMap));
    }

    /**
     * 导出到excel
     *
     * @param header   表头数据
     * @param dataList 数据内容
     * @param response 写出路径
     */
    public static void write(String[] header, List<List<String>> dataList, HttpServletResponse response) throws IOException {
        //标题样式
        WriteCellStyle headWriteCellStyle = EasyExcelUtil.getHeadStyle();
        //内容样式
        WriteCellStyle cellStyle = EasyExcelUtil.getCellStyle();
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, cellStyle);
        EasyExcel.write(response.getOutputStream())
                // 第一行大标题样式设置
                // .registerWriteHandler(new SheetWriteHandlerUtil(fileName))
                //设置默认样式及写入头信息开始的行数
                // .useDefaultStyle(false).relativeHeadRowIndex(1)
                .useDefaultStyle(false)
                // 表头、内容样式设置
                .registerWriteHandler(horizontalCellStyleStrategy)
                // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(15))
                .sheet()
                // 这里放入动态头
                .head(EasyExcelUtil.head(header, null, false))
                // 当然这里数据也可以用 List<List<String>> 去传入
                .doWrite(detail(dataList));
    }

    private static List<List<Object>> detail(Map<String, Integer> map) {
        List<List<Object>> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            List<Object> objectList = new ArrayList<>();
            objectList.add(entry.getKey());
            objectList.add(entry.getValue());
            objectList.add("");
            list.add(objectList);
        }
        return list;
    }


    /**
     * 写入到excel
     *
     * @param header     表头数据
     * @param dataList 数据内容
     * @param path       写出路径
     */
    public static void write(String[] header, List<List<String>> dataList, String path) {
        //标题样式
        WriteCellStyle headWriteCellStyle = EasyExcelUtil.getHeadStyle();
        //内容样式
        WriteCellStyle cellStyle = EasyExcelUtil.getCellStyle();
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, cellStyle);
        EasyExcel.write(path)
                // 第一行大标题样式设置
                // .registerWriteHandler(new SheetWriteHandlerUtil(fileName))
                //设置默认样式及写入头信息开始的行数
                // .useDefaultStyle(false).relativeHeadRowIndex(1)
                .useDefaultStyle(false)
                // 表头、内容样式设置
                .registerWriteHandler(horizontalCellStyleStrategy)
                // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(15))
                .sheet()
                // 这里放入动态头
                .head(EasyExcelUtil.head(header, null, false))
                // 当然这里数据也可以用 List<List<String>> 去传入
                .doWrite(detail(dataList));
    }


    private static List<List<String>> detail(List<List<String>> dataList) {
        dataList.remove(0);
        List<List<String>> list = new ArrayList<>(dataList);
        return list;
    }

}
